package spr

import (
	"db2s/Or/spr/parser"
	"fmt"
	"github.com/antlr4-go/antlr"
	"reflect"
)

func (v *SelectParseS) VisitChildren(node antlr.RuleNode) interface{} {
	for _, child := range node.GetChildren() {
		if childNode, ok := child.(antlr.RuleNode); ok {
			// Check if the child is of type FromClauseContext
			//if selectListClauseNode, ok := childNode.(*pl.PlSqlParser.Selected_listContext); ok { //获取from
			//	v.VisitSelectedList(selectListClauseNode) // Automatically call VisitFromClause
			//}
			//if fromListClauseNode, ok := childNode.(*plSqlParse.From_clauseContext); ok { //获取from
			//	v.VisitTableList(fromListClauseNode) // Automatically call VisitFromClause
			//}
			fmt.Println("---jjj:", reflect.TypeOf(node), reflect.TypeOf(childNode), childNode.GetText())
			//childNode.Accept(v)
		}
	}
	return nil
}

func (v *PlVisitor) VisitChildren(node antlr.RuleNode) interface{} {
	for _, child := range node.GetChildren() {
		if childNode, ok := child.(antlr.RuleNode); ok {
			// Check if the child is of type FromClauseContext
			//if selectListClauseNode, ok := childNode.(*pl.PlSqlParser.Selected_listContext); ok { //获取from
			//	v.VisitSelectedList(selectListClauseNode) // Automatically call VisitFromClause
			//}
			//if fromListClauseNode, ok := childNode.(*plSqlParse.From_clauseContext); ok { //获取from
			//	v.VisitTableList(fromListClauseNode) // Automatically call VisitFromClause
			//}
			fmt.Println("---jjj:", reflect.TypeOf(node), reflect.TypeOf(childNode), childNode.GetText())
			//childNode.Accept(v)
		}
	}
	return nil
}

//	func (v *PlVisitor) VisitFuncExpressionList(tree antlr.ParseTree, res *QueryFuncExpressionS) {
//			if tree.GetChildCount() == 0 {
//				return
//			}
//			for _, child := range tree.GetChildren() {
//				switch childNode := child.(type) {
//				case *plSqlParse.Function_nameContext: //函数名称
//					res.Name = childNode.GetText()
//				case *plSqlParse.Over_clause_keywordContext:
//					res.Name = childNode.GetText()
//				case *plSqlParse.ArgumentContext: //函数传参
//					res.Argument = append(res.Argument, childNode.GetText())
//					if childNode.GetChildCount() > 0 {
//						switch childNode.GetChildren()[0].(type) {
//						case *plSqlParse.Function_call_expression_specContext:
//							var funcExpr = &QueryFuncExpressionS{}
//							v.VisitFuncExpressionList(childNode, funcExpr)
//							res.FuncExpr = funcExpr
//						}
//					}
//				default:
//					//fmt.Println("------kkk:", reflect.TypeOf(tree), reflect.TypeOf(childNode))
//					v.VisitFuncExpressionList(childNode.(antlr.ParseTree), res)
//				}
//			}
//		}
//
//		func caseWhenConditionActive(tree antlr.ParseTree, res *whenThenConditionS) {
//			if tree.GetChildCount() == 0 {
//				return
//			}
//			for _, child := range tree.GetChildren() {
//				switch childNode := child.(type) {
//				case *plSqlParse.VariableContext:
//					res.WhenValue = childNode.GetText()
//				case *plSqlParse.ConditionContext:
//					res.ConditionValue = childNode.GetText()
//				case *plSqlParse.Relational_operatorContext:
//					res.OperatorSymbol = childNode.GetText()
//				case *plSqlParse.Numeric_expression_constant_specContext:
//					res.ConditionValue = childNode.GetText()
//				default:
//					caseWhenConditionActive(childNode.(antlr.ParseTree), res)
//				}
//			}
//		}
//
//		func caseThenConditionActive(tree antlr.ParseTree, res *whenThenConditionS) {
//			if tree.GetChildCount() == 0 {
//				return
//			}
//			for _, child := range tree.GetChildren() {
//				switch childNode := child.(type) {
//				case *plSqlParse.Character_expression_constant_specContext:
//					res.ThenValue = childNode.GetText()
//				default:
//					caseThenConditionActive(childNode.(antlr.ParseTree), res)
//				}
//			}
//		}
//
//		func caseElseConditionActive(tree antlr.ParseTree, res *QueryColumnCaseWhenS) {
//			if tree.GetChildCount() == 0 {
//			}
//			for _, child := range tree.GetChildren() {
//				switch childNode := child.(type) {
//				case *plSqlParse.Character_expression_constant_specContext:
//					res.ElseValue = childNode.GetText()
//				default:
//					caseElseConditionActive(childNode.(antlr.ParseTree), res)
//				}
//			}
//		}
//
//		func caseWhenThenPartActive(tree antlr.ParseTree, res *QueryColumnCaseWhenS) {
//			if tree.GetChildCount() == 0 {
//				return
//			}
//			for _, child := range tree.GetChildren() {
//				var p = &whenThenConditionS{}
//				switch childNode := child.(type) {
//				case *plSqlParse.When_partContext:
//					caseWhenConditionActive(childNode, p)
//				case *plSqlParse.Then_partContext:
//					caseThenConditionActive(childNode, p)
//					//res.ThenValue = p.ThenValue
//				default:
//					fmt.Println("-------ooo:", reflect.TypeOf(childNode))
//					//var p = &whenThenConditionS{}
//					caseWhenThenPartActive(childNode.(antlr.ParseTree), res)
//				}
//				fmt.Println("qqq:", *p)
//				if (len(p.ConditionValue) > 0 || len(p.WhenValue) > 0) && len(p.ThenValue) > 0 {
//					res.CaseWhenThen = append(res.CaseWhenThen, *p)
//				}
//			}
//		}
//
//		func caseWhenSearchedCaseExpression(tree antlr.ParseTree, res *QueryColumnCaseWhenS) {
//			if tree.GetChildCount() == 0 {
//				return
//			}
//			for _, child := range tree.GetChildren() {
//				switch childNode := child.(type) {
//				case *plSqlParse.Case_when_then_partContext: //处理case when then
//					caseWhenThenPartActive(tree, res)
//					//fmt.Println("----haha:", *p)
//				case *plSqlParse.Else_partContext:
//					caseElseConditionActive(childNode, res)
//				default:
//					//var p = &whenThenConditionS{}
//					caseWhenSearchedCaseExpression(child.(antlr.ParseTree), res)
//				}
//			}
//		}
//
//		func (v *PlVisitor) VisitSelectedColumnCaseWhen(tree antlr.ParseTree, res *QueryColumnCaseWhenS) {
//			for _, child := range tree.GetChildren() {
//				switch childNode := child.(type) {
//				case *plSqlParse.Searched_case_expression_specContext: //case when 表达式
//					caseWhenSearchedCaseExpression(childNode, res)
//				case *plSqlParse.Simple_case_expression_specContext: //比较值
//					caseWhenSearchedCaseExpression(childNode, res)
//				default:
//					//v.VisitSelectedColumnCaseWhen(childNode.(antlr.ParseTree), res)
//				}
//			}
//		}
//
//		func (v *PlVisitor) VisitSelectedColumnList(tree antlr.ParseTree, res *QuerySelectColumnS) {
//			if tree.GetChildCount() == 0 {
//				return
//			}
//			for _, child := range tree.GetChildren() {
//				switch childNode := child.(type) {
//				case *plSqlParse.Character_constantContext: //中文
//					res.Value = childNode.GetText()
//					res.UseType = "chinese"
//				case *plSqlParse.Numeric_expression_arithmetic_specContext: //数字运算
//					res.Value = childNode.GetText()
//					res.UseType = "numeric+"
//				case *plSqlParse.VariableContext:
//					res.Value = childNode.GetText()
//					res.UseType = "normal"
//				case *plSqlParse.Numeric_expression_constant_specContext: //数字
//					res.Value = childNode.GetText()
//					res.UseType = "numeric"
//				case *plSqlParse.Function_call_expression_specContext:
//					res.Value = childNode.GetText()
//					var funcExpr = &QueryFuncExpressionS{}
//					v.VisitFuncExpressionList(childNode, funcExpr)
//					res.Func = *funcExpr
//					res.UseType = "func"
//				case *plSqlParse.Searched_case_expression_specContext: //case when 表达式
//					var caseWhen = &QueryColumnCaseWhenS{}
//					caseWhenSearchedCaseExpression(childNode, caseWhen)
//					fmt.Println("-----ggg:", *caseWhen)
//					res.CaseWhen = *caseWhen
//					res.UseType = "caseWhenExpr"
//					res.Value = childNode.GetText()
//				case *plSqlParse.Simple_case_expression_specContext: //case when  表达式
//					var caseWhen = &QueryColumnCaseWhenS{}
//					caseWhenSearchedCaseExpression(childNode, caseWhen)
//					fmt.Println("-----fff:", *caseWhen)
//					res.CaseWhen = *caseWhen
//					res.UseType = "caseWhenValue"
//					res.Value = childNode.GetText()
//				case *plSqlParse.Boolean_expression_literal_specContext:
//					res.Value = childNode.GetText()
//					res.UseType = "null"
//				case *plSqlParse.AliasContext:
//					res.AS = childNode.GetText()
//				default:
//					//fmt.Println("-----dd:", reflect.TypeOf(tree), reflect.TypeOf(child), child.(antlr.ParseTree).GetText())
//					v.VisitSelectedColumnList(childNode.(antlr.ParseTree), res)
//				}
//			}
//			return
//		}
func (v *PlVisitor) VisitSelectedList(tree *parser.Selected_listContext) { //查询列名
	//
	//		for _, child := range tree.GetChildren() {
	//			switch ctx := child.(type) {
	//			case *plSqlParse.Select_list_element_expression_specContext:
	//				var res = &QuerySelectColumnS{}
	//				v.VisitSelectedColumnList(ctx, res)
	//				v.TableQueryBody.SelectColumn = append(v.TableQueryBody.SelectColumn, *res)
	//				//fmt.Println("----llll:", *res, "||", res.Func, "||", res.Func.FuncExpr)
	//			}
	//		}
}

func (v *PlVisitor) VisitFromTableList(tree antlr.ParseTree) {
	//	func (v *PlVisitor) VisitFromTableList(tree antlr.ParseTree, res *QueryFromTableS) {
	//		//if tree.GetChildCount() == 0 {
	//		//	return
	//		//}
	//		//for _, child := range tree.GetChildren() {
	//		//	switch childNode := child.(type) {
	//		//	case *plSqlParse.Query_table_expression_simple_specContext: //单表
	//		//		res.Name = childNode.GetText()
	//		//		v.VisitFromTableList(childNode, res)
	//		//	case *plSqlParse.SubqueryContext:
	//		//		res.TableType = "subQuery"
	//		//		v.VisitFromTableList(childNode, res)
	//		//	case *plSqlParse.Tableview_nameContext:
	//		//		res.TableType = "tableView"
	//		//	case *plSqlParse.Join_clause_derivativeContext:
	//		//	case *plSqlParse.Outer_join_typeContext:
	//		//		res.JoinType = childNode.GetText()
	//		//	case *plSqlParse.ConditionContext:
	//		//		res.JoinOn = append(res.JoinOn, childNode.GetText())
	//		//	case *plSqlParse.AliasContext:
	//		//		res.AS = childNode.GetText()
	//		//	default:
	//		//		//fmt.Println("-----dd:", reflect.TypeOf(tree), reflect.TypeOf(child), child.(antlr.ParseTree).GetText())
	//		//		v.VisitFromTableList(childNode.(antlr.ParseTree), res)
	//		//	}
	//		//}
}
func (v *PlVisitor) VisitTableList(tree antlr.ParseTree) { //查询列名
	//for _, child := range tree.GetChildren() {
	//switch ctx := child.(type) {
	//case *plSqlParse.From_clause_declarationContext:
	//	var res = &QueryFromTableS{}
	//	v.VisitFromTableList(ctx, res)
	//	v.TableQueryBody.FromTable = *res
	//}
	//}
}

func (v *PlVisitor) VisitUnit_statement(tree *parser.Unit_statementContext) {
	fmt.Println("----111")
}
